/**
 * 从视频裁剪出指定区域
 *
 * ```shell
 * $ deno run --allow-run --allow-read --allow-write src/crop.js -c 300:200:0:0 -i temp/input.mp4 -o temp/output-crop.mp4
 * ```
 *
 * 命令行参数说明：
 * 1. -c : 裁剪区域，默认为 "300:200:0:0"，其格式为 "w:h:x:y"，对应裁剪区域的 "宽:高:x坐标:y坐标"
 * 2. -i : 输入视频，默认为 temp/input.mp4
 * 3. -o : 输出视频，默认为 temp/output-crop.mp4，无 -o 键的参数也统一作为 -o 的值
 *
 * 从原始视频中获取合适的裁剪参数建议：
 * 1. 使用 PotPlayer 的右键菜单 "视频/图像截取/截取当前原画面"（快捷键为 Ctrl+E），就会在视频当前，目录下生成视频的截图。
 *    使用画图工具打开找到自己想要截图区域的坐标位置，计算出相应 w:h:x:y 参数值即可。
 * 2. 也可以使用 FormatFactory 软件的 “画面裁剪” 功能使用可视化的方式找到相应的 w:h:x:y 参数值。
 */

import { parse } from "/deno.land/std/flags/mod.ts";
import { ffmpeg } from "./share/ffmpeg.js";
import { log } from "./share/common.js";

// 解析命令行参数
const parsedArgs = parse(Deno.args);

// 构建 ffmpeg 参数
const ffmpegArgs = { "-strict": "strict" };

// 1. 输入文件名，默认 "temp/input.mp4"
ffmpegArgs["-i"] = Object.hasOwn(parsedArgs, "i") ? parsedArgs["i"] : "temp/input.mp4";

// 2. 裁剪区域：默认为 "300:200:0:0"
const crop = Object.hasOwn(parsedArgs, "c") ? parsedArgs["c"] : "300:200:0:0";
ffmpegArgs["-vf"] = `crop=${crop}`;

// 3. 如果有 -y -n --vf 等自定义的参数也添加进去，方便自定义额外的 ffmpeg 参数
if (Object.hasOwn(parsedArgs, "y")) ffmpegArgs["-y"] = true;
if (Object.hasOwn(parsedArgs, "n")) ffmpegArgs["-n"] = true;
if (Object.hasOwn(parsedArgs, "vf")) {
  ffmpegArgs["-vf"] = Object.hasOwn(ffmpegArgs, "-vf") ? `${ffmpegArgs["-vf"]},${parsedArgs["vf"]}` : parsedArgs["vf"];
}

// 4. 输出文件名列表，默认 "temp/output-crop.mp4"
ffmpegArgs["_"] = parsedArgs["_"];
if (Object.hasOwn(parsedArgs, "o")) ffmpegArgs["_"].push(parsedArgs["o"]);
if (ffmpegArgs["_"].length === 0) ffmpegArgs["_"].push(`temp/output-crop.mp4`);

log(`开始生成裁剪视频`);

// 执行 ffmpeg 处理
await ffmpeg(ffmpegArgs, true);

log(`结束`);
